define(['jquery','mage/translate','underscore','Magento_Catalog/js/product/view/product-ids-resolver','Magento_Catalog/js/product/view/product-info-resolver','Magento_Customer/js/customer-data','mage/validation','jquery-ui-modules/widget'],function($,$t,_,idsResolver,productInfoResolver,customerData){'use strict';$.widget('mage.catalogAddToCart',{options:{processStart:null,processStop:null,bindSubmit:true,minicartSelector:'[data-block="minicart"]',messagesSelector:'[data-placeholder="messages"]',productStatusSelector:'.stock.available',addToCartButtonSelector:'.action.tocart',addToCartButtonDisabledClass:'disabled',addToCartButtonRemovingClass:'removing',addToCartButtonTextWhileAdding:'',addToCartButtonTextAdded:'',addToCartButtonTextWhileRemoving:'',addToCartButtonTextRemoved:'',addToCartButtonTextDefault:'',productInfoResolver:productInfoResolver,useQuantity:false,updateQuantity:false},cart:false,itemInCart:false,enableButtonsOnCartUpdate:false,_create:function(){if(this.element.data().qtySynchronized){this.options.updateQuantity=true;} if(this.options.bindSubmit){this._bindSubmit();} $(this.options.addToCartButtonSelector).prop('disabled',false);if(!this.options.useQuantity){return;} if(this.element.data().productSku){this.options.product_sku=this.element.data().productSku;} if(!this.options.updateQuantity){this.element.validation();}else{if(!this.checkIsConfigurable()){this.element.validation();if(this.options.updateQuantity){this.cart=customerData.get('cart');this.checkCart();this.cart.subscribe(function(){this.checkCart();},this);}}}},_bindSubmit:function(){var self=this;if(this.element.data('catalog-addtocart-initialized')){return;} this.element.data('catalog-addtocart-initialized',1);this.element.on('submit',function(e){e.preventDefault();self.submitForm($(this));});},_redirect:function(url){var urlParts,locationParts,forceReload;urlParts=url.split('#');locationParts=window.location.href.split('#');forceReload=urlParts[0]===locationParts[0];window.location.assign(url);if(forceReload){window.location.reload();}},isLoaderEnabled:function(){return this.options.processStart&&this.options.processStop;},submitForm:function(form){if(this.options.useQuantity){if(!this.checkIsConfigurable()){if(this.element.validation().valid()){if(!this.itemInCart||!this.options.updateQuantity){this.ajaxSubmit(form);}else{this.ajaxSubmit(form,true);}}}else{if(this.options.updateQuantity){this.ajaxSubmit(form);}else{if(this.element.validation().valid()){this.ajaxSubmit(form);}}}}else{this.ajaxSubmit(form);}},ajaxSubmit:function(form){let self=this,productIds=idsResolver(form),productInfo=self.options.productInfoResolver(form),formData,newQty,url=form.prop('action');formData=new FormData(form[0]);newQty=parseFloat(formData.get('qty'));$(self.options.minicartSelector).trigger('contentLoading');this.disableQtyInput(form);if(this.cart){if(this.itemInCart){url=window.checkout.updateItemQtyUrl;if(this.itemInCart?.qty==newQty){$(form).find('[name="qty"]').focus();return;} formData.set('item_id',this.itemInCart.item_id);formData.set('item_qty',newQty);}else{if(!newQty){if(this.element.find('[name="qty"]').data('min-allowed')){newQty=this.element.find('[name="qty"]').data('min-allowed');}else{newQty=1;}} this.element.find('[name="qty"]').val(newQty);formData.set('qty',newQty);}} self.disableAddToCartButton(form,newQty);$.ajax({url:url,data:formData,type:'post',dataType:'json',cache:false,contentType:false,processData:false,beforeSend:function(){if(self.isLoaderEnabled()){$('body').trigger(self.options.processStart);}},success:function(res){var eventData,parameters;$(document).trigger('ajax:addToCart',{'sku':form.data().productSku,'productIds':productIds,'productInfo':productInfo,'form':form,'response':res});if(self.isLoaderEnabled()){$('body').trigger(self.options.processStop);} if(res.backUrl){eventData={'form':form,'redirectParameters':[]};$('body').trigger('catalogCategoryAddToCartRedirect',eventData);if(eventData.redirectParameters.length>0&&window.location.href.split(/[?#]/)[0]===res.backUrl){parameters=res.backUrl.split('#');parameters.push(eventData.redirectParameters.join('&'));res.backUrl=parameters.join('#');} self._redirect(res.backUrl);return;} if(res.messages){$(self.options.messagesSelector).html(res.messages);} if(res.minicart){$(self.options.minicartSelector).replaceWith(res.minicart);$(self.options.minicartSelector).trigger('contentUpdated');} if(res.product&&res.product.statusText){$(self.options.productStatusSelector).removeClass('available').addClass('unavailable').find('span').html(res.product.statusText);} if(self.cart){self.enableButtonsOnCartUpdate=true;self.showUpdateQtyActions(!!newQty,newQty)}else{self.enableAddToCartButton(form);}},error:function(res){$(document).trigger('ajax:addToCart:error',{'sku':form.data().productSku,'productIds':productIds,'productInfo':productInfo,'form':form,'response':res});},complete:function(res){if(res.state()==='rejected'){location.reload();}}});},disableAddToCartButton:function(form,newQty){var addToCartButtonTextWhileAdding=this.options.addToCartButtonTextWhileAdding||$t('Adding...'),addToCartButton=$(form).find(this.options.addToCartButtonSelector);if(newQty==0){addToCartButtonTextWhileAdding=this.options.addToCartButtonTextWhileRemoving||$t('Removing...');addToCartButton.addClass(this.options.addToCartButtonRemovingClass)} addToCartButton.addClass(this.options.addToCartButtonDisabledClass);addToCartButton.find('span').text(addToCartButtonTextWhileAdding);addToCartButton.prop('title',addToCartButtonTextWhileAdding);},enableAddToCartButton:function(form){var addToCartButtonTextAdded=this.options.addToCartButtonTextAdded||$t('Added'),self=this,addToCartButton=$(form).find(this.options.addToCartButtonSelector);if(addToCartButton.hasClass(this.options.addToCartButtonRemovingClass)){addToCartButtonTextAdded=this.options.addToCartButtonTextRemoved||$t('Removed...');addToCartButton.removeClass(self.options.addToCartButtonRemovingClass)} addToCartButton.find('span').text(addToCartButtonTextAdded);addToCartButton.prop('title',addToCartButtonTextAdded);setTimeout(function(){var addToCartButtonTextDefault=self.options.addToCartButtonTextDefault||$t('Add to Cart');addToCartButton.removeClass(self.options.addToCartButtonDisabledClass);addToCartButton.find('span').text(addToCartButtonTextDefault);addToCartButton.prop('title',addToCartButtonTextDefault);},1000);this.enableQtyInput(form);},checkIsConfigurable:function(){return!!_.find(this.element.serializeArray(),function(item){return item.name.indexOf('super_attribute')!==-1;});},checkCart:function(){let itemQty=0;this.itemInCart=false;if(this.cart&&this.cart()&&this.cart().items){$.each(this.cart().items,function(key,item){if(this.options.product_sku==item.product_sku){itemQty=item.qty;this.itemInCart=item;return false;}}.bind(this))} this.showUpdateQtyActions(this.itemInCart,itemQty);if(this.itemInCart){this.element.find('[name="qty"]').val(itemQty).change();this.enableQtyInput(this.element);} if(this.enableButtonsOnCartUpdate){this.enableAddToCartButton(this.element);this.enableButtonsOnCartUpdate=false;}},showUpdateQtyActions:function(inCart,qty){let $inputQtyElement=this.element.find('[name="qty"]'),$productItemActionsQty=this.element.closest('.product-item').find('[data-role="product-qty-render"]');$inputQtyElement.data('item-qty',qty) $productItemActionsQty.text(qty).parent().toggleClass('no-qty',qty==0);if(inCart){this.element.find('.field.qty').removeClass('no-display');this.element.find('.action.tocart').addClass('no-display');}else{if($inputQtyElement.data('min-allowed')){$inputQtyElement.val($inputQtyElement.data('min-allowed'));} this.element.find('.field.qty').addClass('no-display');this.element.find('.action.tocart').removeClass('no-display');}},disableQtyInput:function(form){$(form).find('[name="qty"]').prop('disabled',true).addClass('disabled').attr('disabled','disabled');$(form).find('.quantity-control').trigger('disableQtyControls');},enableQtyInput:function(form){$(form).find('[name="qty"]').prop('disabled',false).removeClass('disabled').removeAttr('disabled');$(form).find('.quantity-control').trigger('enableQtyControls');},});return $.mage.catalogAddToCart;});